7889
17702
Jeg viser en liste over kontakter fra Web Service og viser den i kontakter 'seksjonert' tableView som vist på skjermbildet.
Problemet er at jeg får samme merkeverdier for avmerkingsboksene i første rad for seksjon A så vel som seksjon S. Jeg har sortert en matrise og vist i den indekserte tabellvisningen. Hvordan få forskjellige merkeverdier avhengig av indexPath.row uavhengig av antall seksjoner som vises. Her er hva jeg prøvde
I celleForRowAtIndexPath:
UIButton * sjekkboks;
hvis (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiomPhone)
{
checkBox = [[UIButton alloc] initWithFrame: CGRectMake (7, 8, 30, 30)];
}
ellers
{
checkBox = [[UIButton alloc] initWithFrame: CGRectMake (15, 13, 30, 30)];
}
// int cnt = 0;
// for (int i = indexPath.section - 1; i> 0; i--)
// {
// cnt + = [[objectsForCharacters objectForKey: [arrayOfCharacters objectAtIndex: i]] count]; // arrayOfCharachters har røyke 'A' til 'Z'
//}
//checkBox.tag = cnt + indexPath.row;
[checkBox setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal];
[checkBox addTarget: self action: @selector (checkBoxClicked :) forControlEvents: UIControlEventTouchUpInside];
[checkBox setTag: indexPath.row];
[cell.contentView addSubview: checkBox];
returcelle;
}
- (ugyldig) checkBoxClicked: (id) avsender
{
CGPoint buttonPosition = [avsender convertPoint: CGPointZero toView: self.tableViewContact];
NSIndexPath * indexPath = [self.tableViewContact indexPathForRowAtPoint: buttonPosition];
UIButton * tappedButton = (UIButton *) avsender;
NSLog (@ "Tag nummer =% d", [avsender tag]);
if ([tappedButton.currentImage isEqual: [UIImage imageNamed: @ "checkBox.png"]])
{
[sender setImage: [UIImage imageNamed: @ "checkBoxMarked.png"] forState: UIControlStateNormal];
hvis (indexPath! = Nil)
{
NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row]; // lagre avkrysnings-ID-er i mutableArrayOfIds
NSLog (@ "Merket avkrysset knapp id =% @", finalIntId);
[arrayOfIds addObject: finalIntId];
}
// NSString * finalIntId = [mutableArrayOfIds objectAtIndex: tappedButton.tag];
// NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row];
}
ellers
{
[sender setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal];
NSLog (@ "UnChecked");
// [arrayOfIds removeObjectAtIndex: tappedButton.tag];
}
}
- (NSString *) tableView: (UITableView *) tableView titleForHeaderInSection: (NSInteger) seksjon {
hvis ([arrayOfCharacters count] == ​​0)
{
komme tilbake @"";
}
returnere [NSString stringWithFormat: @ "% @", [arrayOfCharacters objectAtIndex: seksjon]];
}
- (NSArray *) seksjonIndexTitlesForTableView: (UITableView *) tableView
{
NSArray * toBeReturned = [NSArray arrayWithArray:
[@ "A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | # "
componentsSeparatedByString: @ "|"]];
gå tilbake til BeReturned;
}
- (NSInteger) tableView: (UITableView *) tableView sectionForSectionIndexTitle: (NSString *) title atIndex: (NSInteger) index
{
NSInteger count = 0;
for (NSString * tegn i arrayOfCharacters) {
hvis ([tegn erEqualToString: tittel]) {
returantall;
}
telle ++;
}
retur 0;
}
- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView
{
return [arrayOfCharacters count];
// retur 1;
}
- (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) seksjon
{
// return [mutableArray count];
return [[objectsForCharacters objectForKey: [arrayOfCharacters objectAtIndex: section]] count];
} 
du setter den samme merkeverdien for alle seksjoner som har samme rad.
IndexPath har to egenskaper, {seksjon, rad}.
La oss si at seksjon A har to rader,
for rad1 -> indexPath.section = 0, indexPath.row = 0;
for rad2-> indexPath.section = 0, indexPath.row = 1;
La oss si at seksjon S har to rader,
for rad1 -> indexPath.section = 1, indexPath.row = 0;
for rad2-> indexPath.section = 1, indexPath.row = 1;
Så, for rad 1 i seksjon A og rad 1 i seksjon S, setter du den samme merkeverdien som er 0. Det er problemet ditt.
Prøv å angi merkeverdi som nedenfor.
button.tag = indexPath.section * 1000 + indexPath.row;
når du henter seksjonen og raden,
NSInteger seksjon = (button.tag) / 1000;
NSInteger row = (button.tag)% 1000;
|
Prøv dette...
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
{
statisk NSString * CellIdentifier = @ "Cell";
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];
hvis (celle == null) {
cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: CellIdentifier];
}
UIButton * checkBox = [[UIButton alloc] initWithFrame: CGRectMake (280, 10, 50, 44)];
checkBox.backgroundColor = [UIColor orangeColor];
[checkBox addTarget: self action: @selector (checkBoxClicked: event:) forControlEvents: UIControlEventTouchUpInside];
[checkBox setTag: indexPath.row];
[cell.contentView addSubview: checkBox];
returcelle;
}
- (ugyldig) checkBoxClicked: (id) avsenderhendelse: (id) hendelse
{
NSSet * berører = [event allTouches];
UITouch * touch = [berører anyObject];
CGPoint currentTouchPosition = [berør locationInView: self.tv]; // her er tv TableView Object
NSIndexPath * indexPath = [self.tv indexPathForRowAtPoint: currentTouchPosition];
NSLog (@ "verdi av indePath.section% d, indexPath.row% d", indexPath.section, indexPath.row);
}
|
Dette skjer fordi du tilordner tag til knapper INDEPENDENT av seksjoner.
Begge første rader av seksjoner A og S har rad = 0. så merket tilordnet til deres respektive knapp er 0. Du bør tilordne dem.
Jeg vil foreslå å tilordne tilgjengelighetshint med kommaseparert skjema som inneholder seksjon, rad.
Og i din metode
- (ugyldig) checkBoxClicked: (id) avsender
{
// plukk streng fra kommaadskilt form. Første er din seksjon, 2. er rad.
}
det andre alternativet er Gjør hva du gjør og implementer knappemetoden din slik.
CGPoint buttonPosition = [avsender convertPoint: CGPointZero toView: self.tableView];
NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: buttonPosition];
hvis (indexPath! = null)
{
... indexpath.section er din seksjon, index path.row er din rad.
}
Det er også det tredje alternativet.
i cellforRowAtIndexpath tildel knappen en tittel
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
[btn setTitle: <# Your Row #> forState: UIControlStateDisabled];
[btn setTag <# Your Section #>];
så når du mottar i knappemetoden din, kan du ha både seksjon (tag) og rad (tittel for deaktivert tilstand).
- (ugyldig) checkBoxClicked: (id) avsender {[button titleForState: UIControlStateDisabled]; // din rad
button.tag // din seksjon}
|
Prøv dette!
Hver seksjon vet du kanskje antall teller til høyre, og legg deretter til antall individuelle rader.
[[fieldTitlesList objectAtIndex: indexPath.section - 1] count] + indexPath.row
Hvor fieldTitlesList er matrisen til seksjonene dine.
|
Jeg la til følgende kode som løste problemet mitt
NSInteger rowNumber = 0;
for (NSInteger i = 0; i